home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 050 / main.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  9KB  |  394 lines

  1. /* 男は一本槍 */
  2.  
  3. /* main.c */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <sys/dos.h>
  9. #include <sys/iocs.h>
  10. #include <XSP2lib.H>
  11. #include <pcm8afnc.h>
  12.  
  13.  
  14. #define GLOBAL_DEFINE        /* グローバル変数を確保する */
  15. #include "main.h"
  16. #include "player.h"
  17. #include "shot.h"
  18. #include "enemy.h"
  19. #include "eshot.h"
  20. #include "effect.h"
  21. #include "entry.h"
  22. #include "psearch.h"
  23. #include "gvram.h"
  24. #include "txfont.h"
  25. #include "sound.h"
  26.  
  27. static int old_crtmod;
  28.  
  29. #define PCG_MAX    256        /* パターンデータの個数 */
  30. #define REF_MAX    512        /* リファレンスデータの個数 */
  31. #define FRM_MAX    8192        /* フレームデータの個数 */
  32.  
  33. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  34. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  35. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  36. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  37.  
  38. static int sizeof_pcg = 0;    /* スプライトPCGパターン読み込み数 */
  39. static int sizeof_ref = 0;    /* 複合スプライトリファレンスデータ読み込み数 */
  40. static int sizeof_frm = 0;    /* 複合スプライトフレームデータ読み込み数 */
  41.  
  42. static unsigned short pal_dat[16][15];    /* スプライトパレットデータ */
  43.  
  44. #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
  45.  
  46.  
  47.  
  48. void usage (void)
  49. {
  50.     printf (
  51.                "縦スクロールシューティング・一本槍 IPPON.X ver0.50"
  52.                "        programmed by Mitsuky <FreeSoftware>\n"
  53.                "自機ショットが敵に刺さるようにした\n"
  54.                "得点関係の処理を追加\n"
  55.                "敵キャラを増やした\n"
  56.                "このバージョンでゲームとしての骨格は固まったはず\n"
  57.                "(後は敵キャラの追加・エントリー作成がメイン)\n"
  58.         );
  59. }
  60.  
  61.  
  62.  
  63. /* 垂直同期ごとに呼ばれるルーチン */
  64. static void VdispRoutine (void)
  65. {
  66.     static int y0 = 0, y1 = 0;
  67.  
  68.     *(volatile unsigned int *) 0xe80018 = *(volatile unsigned int *) 0xe8001c = y0;
  69.     y0 -= 2;
  70.     y0 &= 511;
  71.  
  72.     *(volatile unsigned int *) 0xe80020 = *(volatile unsigned int *) 0xe80024 = y1;
  73.     y1 -= 4;
  74.     y0 &= 511;
  75. }
  76.  
  77.  
  78.  
  79. /* 終了時に1度だけ呼ばれる・エラーだったら返ってこない */
  80. void Tini (void)
  81. {
  82.     int sp;
  83.  
  84.     switch (error_level) {
  85.     case ERROR_NON:
  86.         xsp_vsyncint_off ();
  87.         pcm8a_vsyncint_off ();
  88.         xsp_off ();
  89.         /* 画面モードを元に戻す */
  90.         sp = _iocs_b_super (0);
  91.         *(unsigned short *) 0xe8e006 &= 0xfffd;        /* HRL ビットを元に戻す */
  92.         _iocs_b_super (sp);
  93.         _iocs_crtmod (old_crtmod);
  94.         _dos_kflushio (0xff);    /* キーバッファをクリア */
  95.         /* break が無い事に注意 */
  96.  
  97.     case ERROR_SOUND:
  98.         SoundTini();
  99.         /* break が無い事に注意 */
  100.     case ERROR_FILE:
  101.         _iocs_tgusemd (1, 3);
  102.         /* break が無い事に注意 */
  103.     case ERROR_GUSEMD:
  104.         _iocs_tgusemd (0, 3);
  105.         /* break が無い事に注意 */
  106.     case ERROR_TUSEMD:
  107.         /* break が無い事に注意 */
  108.     default:
  109.         break;
  110.     }
  111.  
  112.     _iocs_b_curon ();
  113.  
  114.     if (error_level != ERROR_NON) {
  115.         /* エラーが発生した場合 */
  116.         puts (error_message);
  117.         exit (-1);    /* 終了する */
  118.     }
  119. }
  120.  
  121.  
  122.  
  123. /* 起動時のファイル読み込み */
  124. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  125. /* 返り値 : 読み込んだ項目数 */
  126. static int LoadFile (char *fname, void *ptr, size_t size, size_t n)
  127. {
  128.     FILE *fp;
  129.     int i;
  130.  
  131.     fp = fopen (fname, "rb");
  132.     if (fp == NULL) {
  133.         static char e[256];
  134.         error_level = ERROR_FILE;
  135.         error_message = e;
  136.         sprintf (e, "ファイル %s が読み込めません\n", fname);
  137.         Tini ();    /* 返ってこない */
  138.     }
  139.     i = fread (ptr, size, n, fp);
  140.     fclose (fp);
  141.  
  142.     return (i);        /* 返り値は読み込み項目数 */
  143. }
  144.  
  145.  
  146.  
  147. /* XSP 各種データ読み込み・ファイル名は拡張子を付けずに指定すること */
  148. /* 返り値 : 複合スプライトNo. */
  149. static short LoadXSP (char *fname)
  150. {
  151.     int i;
  152.     int p, f, r;
  153.     short obj_no = sizeof_ref;
  154.     char temp_fname[92];
  155.  
  156.     strcpy (temp_fname, fname);
  157.     strcat (temp_fname, ".FRM");
  158.     f = LoadFile (temp_fname, &frm_dat[sizeof_frm], sizeof (XOBJ_FRM_DAT), FRM_MAX - sizeof_frm);
  159.  
  160.     strcpy (temp_fname, fname);
  161.     strcat (temp_fname, ".REF");
  162.     r = LoadFile (temp_fname, &ref_dat[sizeof_ref], sizeof (XOBJ_REF_DAT), REF_MAX - sizeof_ref);
  163.  
  164.     strcpy (temp_fname, fname);
  165.     strcat (temp_fname, ".XSP");
  166.     p = LoadFile (temp_fname, &pcg_dat[sizeof_pcg], sizeof (char), 128 * PCG_MAX - sizeof_pcg);
  167.  
  168.     /* FRM_DAT[].pt 補正 */
  169.     for (i = 0; i < f; i++)
  170.         frm_dat[sizeof_frm + i].pt += sizeof_pcg / 128;
  171.  
  172.     /* REF_DAT[].ptr 補正 */
  173.     for (i = 0; i < r; i++)
  174.         (int) ref_dat[sizeof_ref + i].ptr += (int) (&frm_dat[sizeof_frm]);
  175.     sizeof_pcg += p;
  176.     sizeof_frm += f;
  177.     sizeof_ref += r;
  178.  
  179. #ifdef DEBUG
  180.     printf ("%s を読み込みました sizeof_ref = %hd\n", fname, obj_no);
  181. #endif
  182.  
  183.     return (obj_no);
  184. }
  185.  
  186.  
  187.  
  188. /* SP データ読み込み */
  189. static short LoadSP (char *fname)
  190. {
  191.     int p;
  192.     short sp_no = sizeof_pcg / 128;
  193.     char temp_fname[92];
  194.  
  195.     strcpy (temp_fname, fname);
  196.     strcat (temp_fname, ".SP");
  197.     p = LoadFile (temp_fname, &pcg_dat[sizeof_pcg], sizeof (char), 128 * PCG_MAX - sizeof_pcg);
  198.  
  199.     sizeof_pcg += p;
  200.  
  201. #ifdef DEBUG
  202.     printf ("%s を読み込みました sp_no = %hd\n", fname, sp_no);
  203. #endif
  204.     return (sp_no);
  205. }
  206.  
  207.  
  208.  
  209. /* 起動時に1度だけ呼ばれる */
  210. static void Init (void)
  211. {
  212.     int sp;
  213.     int i, j;
  214.     static unsigned short crtcdata[9] =
  215.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 0x0111};
  216.     static unsigned short textpalet[16] =
  217.     {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  218.     unsigned short *s, *d;
  219.  
  220.     error_message = NULL;
  221.  
  222.     /* テキスト画面の使用状況をチェック */
  223.     error_level = ERROR_TUSEMD;
  224.     if (_iocs_tgusemd (1, -1) == 2) {    /* ユーザーが使用中なら */
  225.         error_message = "テキスト VRAM が使用中です";
  226.         Tini ();
  227.     }
  228.     _iocs_tgusemd (1, 2);
  229.     /* グラフィック画面の使用状況をチェック */
  230.     error_level = ERROR_GUSEMD;
  231.     i = _iocs_tgusemd (0, -1);
  232.     if ((i == 1) || (i == 2)) {    /* システムまたはユーザーが使用中なら */
  233.         error_message = "グラフィック VRAM が使用中です";
  234.         Tini ();
  235.     }
  236.     _iocs_tgusemd (0, 2);
  237.  
  238.  
  239.     /* 各種ファイル読み込み */
  240.     error_level = ERROR_FILE;
  241.     obj_player = LoadXSP ("SP/PLAYER");
  242.     obj_shot = LoadXSP ("SP/SHOT");
  243.     obj_zako02 = LoadXSP ("SP/ZAKO02");
  244.     obj_covern = LoadXSP ("SP/COVERN");
  245.     obj_oplaser = LoadXSP ("SP/OPLASER");
  246.     obj_explall = LoadXSP ("SP/EXPLALL");
  247.     obj_points = LoadXSP ("SP/POINTS");
  248.  
  249.     sp_core = LoadSP ("SP/CORE");
  250.     sp_eshot = LoadSP ("SP/ESHOT");
  251.  
  252. #ifdef DEBUG
  253.     printf ("    PCG 使用数 = %d\n    REF 使用数 = %d\n    FRM 使用数 = %d\n",
  254.         sizeof_pcg / 128, sizeof_ref, sizeof_frm);
  255. #endif
  256.  
  257.     LoadFile ("SP/MAIN.PAL", &pal_dat, sizeof (unsigned short), 16 * 15);
  258.  
  259.     LoadFile ("TBL/PSTABLE.DAT", pstable, sizeof (unsigned char), 256 * 256);
  260.     LoadFile ("TBL/RNDTABLE.DAT", rndtable, sizeof (unsigned char), 256);
  261.     LoadFile ("TBL/XYTABLE.DAT", &xytable, sizeof (VECTOR), SPEED_MAX * 256);
  262.     LoadFile ("DAT/STAGE.DAT", &stage_data, sizeof (ENTRY), ENTRY_MAX);
  263.     LoadFile ("DAT/ALPHA2.DAT", &font_data, sizeof (unsigned char), 2048);
  264.  
  265.     LoadFile ("BG/STAGE.MAP", bg_map, sizeof (char), 30 + 32 * 128 * 2);
  266.     LoadFile ("BG/STAGE.SP", bg_sp, sizeof (char), 32 * 256);
  267.     LoadFile ("BG/STAGE.PAL", bg_pal, sizeof (unsigned short), 64);
  268.  
  269.     error_level = ERROR_SOUND;
  270.     SoundInit();
  271.  
  272.     error_level = ERROR_NON;    /* エラーなし */
  273.  
  274.     /* XSP 関連の初期化 */
  275.     xsp_on ();
  276.     xsp_mode (3);
  277.     /* パターンデータを定義 */
  278.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  279.     xsp_objdat_set (ref_dat);
  280.  
  281.  
  282.     /* 画面モードの初期化 */
  283.     /* 256x256ドット 31kHz 256色モードに */
  284.     old_crtmod = _iocs_crtmod (-1);        /* 前の CRTMOD を保存 */
  285.     _iocs_crtmod (10);    /* 256x256dot 31kHz 256色 */
  286.     _iocs_g_clr_on ();    /* 一応 */
  287.     _iocs_sp_init ();    /* スプライトの初期化 */
  288.     _iocs_sp_on ();
  289.  
  290.     /* 256x256 正方形モードを作る */
  291.     sp = _iocs_b_super (0);
  292.     *(unsigned short *) 0xe80028 = crtcdata[8];
  293.     d = (unsigned short *) 0xe80002;
  294.     for (i = 1; i < 8; i++)
  295.         *d++ = crtcdata[i];
  296.     *(unsigned short *) 0xe80000 = crtcdata[0];
  297.  
  298.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  299.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  300.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  301.     *(unsigned short *) 0xeb080e = crtcdata[6];
  302.     *(unsigned int *) 0xe80018 = *(unsigned int *) 0xe8001c
  303.         = *(unsigned int *) 0xe80020 = *(unsigned int *) 0xe80024
  304.         = (0 << 16) + 0;    /* グラフィック画面の座標 */
  305.  
  306.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  307.  
  308.     /* テキスト画面のパレットを設定 */
  309.     s = (unsigned short *) 0xe82200;
  310.     for (i = 0; i < 16; i++)
  311.         *s++ = textpalet[i];
  312.  
  313.     _iocs_b_super (sp);
  314.  
  315.     /* スプライトのパレットデータを定義 */
  316.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  317.     {
  318.         unsigned short *p = (unsigned short *) pal_dat;
  319.         for (i = 1; i < 16; i++)
  320.             for (j = 0; j < 16; j++)
  321.                 _iocs_spalet (0x80000000 | j, i, *p++);
  322.     }
  323.  
  324.     TxfontInit ();        /* フォント関連の初期化 */
  325.     _iocs_b_curoff ();    /* カーソルを消す */
  326.  
  327.     xsp_vsyncint_on (&VdispRoutine);
  328.     pcm8a_vsyncint_on ();
  329. }
  330.  
  331.  
  332.  
  333. /* ゲーム本体 */
  334. static void Game (void)
  335. {
  336.     int i;
  337.     int old_score = -1;    /* 初回は必ず表示されるように */
  338.  
  339.     /* グラフィック画面のパレットを設定 */
  340.     for (i = 0; i < 64; i++)
  341.         _iocs_gpalet (i + 16, bg_pal[i]);
  342.     GvramInit ();        /* グラフィック画面関連の初期化 */
  343.  
  344.     score = 0;
  345.  
  346.     PlayerInit ();
  347.     ShotInit ();
  348.     EnemyInit ();
  349.     EshotInit ();
  350.     EffectInit ();
  351.     EntryInit ();
  352.  
  353.     PlayerAlloc ();
  354.  
  355.     do {
  356.         xsp_vsync (0);    /* 垂直同期を待つ */
  357.  
  358.         EntryMove ();
  359.         PlayerMove ();
  360.         ShotMove ();
  361.         EnemyMove ();
  362.         EshotMove ();
  363.         EffectMove ();
  364.         SoundMove ();
  365.  
  366.         xsp_out ();    /* 表示 */
  367.  
  368. #define    SCORE_X    2
  369. #define    SCORE_Y    0
  370.         if (score != old_score) {    /* 更新された時のみ表示 */
  371.             char temp_str[32];
  372.             old_score = score;
  373.             sprintf (temp_str, "SCORE %06d", score);
  374.             TxfontCursor (SCORE_X, SCORE_Y);
  375.             TxfontPuts (temp_str);
  376.         }
  377.     } while (!game_over);
  378. }
  379.  
  380.  
  381.  
  382. int main (int argc, char *argv[])
  383. {
  384.     if (argc != 1) {
  385.         usage ();
  386.         return (-1);
  387.     }
  388.     Init ();
  389.     Game ();
  390.     Tini ();
  391.  
  392.     return (0);
  393. }
  394.